package ru.neoflex.jedit.plugin.utils;

import org.apache.commons.io.filefilter.FalseFileFilter;

import java.util.Set;

/**
 * Утилиты для
 */
public class XhtmlUtils {
    /**
     * В каком мест xhtml файла мы находимся в текущий момент?
     */
    public static XhtmlPosition defineXhtmlPosition(String text, int position) {
        if (position == 0) return XhtmlPosition.EMPTY_SPACE;

        int ptr = position - 1;
        if (text.charAt(ptr) == '<') {
            if (text.length() == position) return XhtmlPosition.IN_OPEN_TAG;
            else if (text.charAt(ptr + 1) == '/') return XhtmlPosition.IN_CLOSE_TAG;
            else return XhtmlPosition.IN_OPEN_TAG;
        }
        if (text.charAt(ptr) == '>') {
            while (ptr >= 0) {
                if (text.charAt(ptr) == '>') return XhtmlPosition.IN_CLOSE_TAG;
                else if (text.charAt(ptr) == '<') return XhtmlPosition.IN_OPEN_TAG;
                else if (text.charAt(ptr) == '/') {
                    if (ptr > 0 && text.charAt(ptr - 1) == '<') return XhtmlPosition.IN_CLOSE_TAG;
                    else return XhtmlPosition.IN_OPEN_TAG;
                }
                ptr--;
            }
            return XhtmlPosition.IN_CLOSE_TAG;
        }

        while (ptr >= 0) {
            if (text.charAt(ptr) == '{') return XhtmlPosition.IN_EL_EXPRESSION;
            if (text.charAt(ptr) == '"') {
                int ptr2 = ptr;
                int counter = 0;
                while (ptr2 >= 0 && text.charAt(ptr2) != '<') {
                    if (text.charAt(ptr2) == '"') counter++;
                    ptr2--;
                }
                if (counter % 2 == 0) return XhtmlPosition.IN_OPEN_TAG;
                else return XhtmlPosition.IN_ATTRIBUTE;
            }
            if (text.charAt(ptr) == '<') return XhtmlPosition.IN_OPEN_TAG;
            if (text.charAt(ptr) == '/') {
                if (ptr > 0 && text.charAt(ptr - 1) == '<') return XhtmlPosition.IN_CLOSE_TAG;
                else return XhtmlPosition.IN_ATTRIBUTE;
            }
            if (text.charAt(ptr) == '>') return XhtmlPosition.EMPTY_SPACE;
            ptr--;
        }
        return XhtmlPosition.EMPTY_SPACE;
    }

    public static String getTagName(String text, int position) {
        try {
            int startPosition = -1;
            int endPosition = -1;
            int ptr = position - 1;

            while (ptr >= 0 && text.charAt(ptr) != '<') ptr--;
            startPosition = ptr + 1;
            while (ptr < text.length() && text.charAt(ptr) != ' ' && text.charAt(ptr) != '>') ptr++;
            endPosition = ptr;

            return text.substring(startPosition, endPosition);
        } catch (StringIndexOutOfBoundsException e) {
            //  TODO: Нужно нормально реализовать эту функцию
            return null;
        }
    }

    public static boolean isTagEntered(String text, int position) {
        int ptr = position - 1;
        while (ptr >= 0 && text.charAt(ptr) != '<') {
            if (!Character.isLetter(text.charAt(ptr)) && text.charAt(ptr) != ':') {
                return true;
            }
            ptr--;
        }
        return false;
    }

    public static String getPrefix(String text, int position) {
        int ptr = position - 1;
        while (ptr >= 0 && (Character.isLetter(text.charAt(ptr)) || Character.isDigit(text.charAt(ptr)) || text.charAt(ptr) == ':'))
            ptr--;
        return text.substring(ptr + 1, position);
    }

    public static String getFullTag(String text, int position) {
        try {
            int startPosition = -1;
            int endPosition = -1;
            int ptr = position;

            while (text.charAt(ptr) != '<') ptr--;
            startPosition = ptr + 1;
            while (text.charAt(ptr) != '>') ptr++;
            endPosition = ptr;

            return text.substring(startPosition, endPosition);
        } catch (StringIndexOutOfBoundsException e) {
            //  TODO: Нужно нормально реализовать эту функцию
            return null;
        }
    }

    public static void main(String[] args) {
        System.out.println(extractElExpression(" value=\"${buildVersion}\"", 13));
    }

    public static String extractElExpression(String text, int position) {
        int ptr = position - 1;
        int startPosiotion = -1;
        int endPosition = -1;
        while (ptr >= 0) {
            if (text.charAt(ptr) == '{') {
                startPosiotion = ptr + 1;
                break;
            }
            ptr--;
        }

        while (ptr < text.length()) {
            if (text.charAt(ptr) == '}') {
                endPosition = ptr;
                break;
            }
            ptr++;
        }

        if (startPosiotion != -1 && endPosition != -1)
            return text.substring(startPosiotion, endPosition);
        else return null;
    }
}
